﻿using System;
using System.IO;
using System.Net;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Collections.Generic;

namespace HabraReader
{
    struct HTMLLoaderParams//Список параметров
    {
        public String URL;
        public WebProxy Proxy;       
    }
    class HTMLLoader
    {
        //Для избавления от подвисаний во время загрузки страниц
        private BackgroundWorker BackWorker = new BackgroundWorker();

        //Сообщим что наш класс выполнил загрузку и готов отдать html
        public event EventHandler PageLoadComplete = null;

        //Свойство для внешнего доступа к инициализированному URL
        public String URL
        {
            get;
            private set;//Нельзя изменять вне класса
        }
        //Свойство для внешнего доступа к html загруженной страницы
        public String PageHTML
        {
            get;
            private set;//Нельзя изменять вне класса
        }
        //Стандартный загрузчик
        public HTMLLoader(String Url)
        {
            BackWorker.DoWork += new DoWorkEventHandler(LoadPage);
            BackWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(LoadPageComplete);
            BackWorker.RunWorkerAsync(new HTMLLoaderParams() { URL = Url, Proxy = null });
        }
        //Загрузчик с прокси
        public HTMLLoader(String Url, WebProxy Proxy)
        {
            BackWorker.DoWork += new DoWorkEventHandler(LoadPage);
            BackWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(LoadPageComplete);
            BackWorker.RunWorkerAsync(new HTMLLoaderParams() { URL = Url, Proxy = Proxy });
        }
        //Код загрузки страницы
        private void LoadPage(Object sender, DoWorkEventArgs args)
        {
            try
            {
                HTMLLoaderParams param = (HTMLLoaderParams)args.Argument;//Получаем аргументы
                HttpWebRequest web_request = (HttpWebRequest)HttpWebRequest.Create(param.URL);//Создаём веб-запрос
                if (param.Proxy != null)//Если прокси указан, добавляем к запросу
                    web_request.Proxy = param.Proxy;
                web_request.Headers.Add("PageLoadBy", "HabraReader");//Подпись HabraReader
                //Выполняем запрос и читаем ответ
                args.Result = new StreamReader(web_request.GetResponse().GetResponseStream()).ReadToEnd();
            }
            catch (UriFormatException) { Box.ShowErrorMessage("HTML Loader error!", "Невозможно загрузить страницу. Неверный формат URL!"); }
            catch (WebException) { Box.ShowErrorMessage("HTML Loader error!", "Невозможно загрузить страницу. Неизвестная ошибка!"); }
            catch (IOException) { Box.ShowErrorMessage("HTML Loader error!", @"Невозможно загрузить страницу. Неизвестная ошибка I\O"); }
        }
        //Выполнить после завершения загрузки
        private void LoadPageComplete(Object sender, RunWorkerCompletedEventArgs args)
        {
            //Устанавливаем результат загрузки страницы
            PageHTML = Convert.ToString(args.Result);
            //Сообщаем о завершении и возвращаем в кач-ве sender'а сам html код
            if (PageLoadComplete != null)//Проверяем есть ли подписчики, иначе возможна ошибка
                PageLoadComplete(PageHTML, new EventArgs());            
        }
    }
}
